﻿using System;
using System.Collections.Generic;
using Go.Tools;
using tpGo;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.Collections;
using System.Text;
using System.IO;

namespace Go.Model
{
    public class LanPlayer : Player
    {
        static int TAMANIOTRANSFERENCIA = 50;
        Socket socket;
        private static Position actualMove;
        private static Boolean actualMoveIsSetted;
        private Game game;

        public String parserSendSocket(Position lastPlayed, Color color)
        {
            String mensaje_enviado = "";
            String comando = "play ";
            char letraTablero = (char)(lastPlayed.X + 64);
            String posicion = letraTablero.ToString() + lastPlayed.Y;
            return mensaje_enviado = comando + color + " " + posicion + " \n";
        }

        public void setearGame(Game juego)
        {
            game = juego;
        }

        public Coordinate parserReceiveSocket(String mensaje)
        {
            Coordinate _coordinate = new Coordinate();
            String comando = mensaje.Substring(0, mensaje.IndexOf(" "));
            if (comando == "play")
            {
                String posicionX = mensaje.Substring(11,1);
                _coordinate.x = (Convert.ToInt32(posicionX[0]) - 64);
                String posicionY = mensaje.Substring(12, 1);
                _coordinate.y = Int32.Parse(posicionY);
                return _coordinate;
            }
            return _coordinate;
        }

        public String recibirMensaje (Socket socket)
        {
            string dataFromClient = null;
            byte[] bytesLeidos = new byte[TAMANIOTRANSFERENCIA];
            while (dataFromClient == null)
            {
                socket.Receive(bytesLeidos, SocketFlags.None);
                dataFromClient = System.Text.Encoding.ASCII.GetString(bytesLeidos);
                dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("\n"));
            }
            return dataFromClient;
        }

        public void enviarMensaje (Socket socket, String mje)
        {
            Byte[] SendBytes = Encoding.ASCII.GetBytes(mje);
            try
            {
                socket.Send(SendBytes, SendBytes.Length, SocketFlags.None);
            }
            catch (Exception error) {}
        }

        public LanPlayer(Color aColor, String name,Socket socketRecibido): base(aColor, name)
        {
            this.socket = socketRecibido;
            actualMove = null;
            actualMoveIsSetted = false;
        }

        public override void play()
        {
            Coordinate _coordinate = new Coordinate();
            NotifyObservers(this);
            base.play();
            //envio el mensaje de que jugue, y en que posicion lo hice.
            if (this.Opponent.LastPlayed != null)
            {
                String mensaje_enviado = parserSendSocket(this.Opponent.LastPlayed, this.Opponent.Color);
                enviarMensaje(this.socket, mensaje_enviado);
            }
            
            //recibo la jugada del jugador remoto.
            String mensaje_recibido = recibirMensaje(this.socket);
            _coordinate = parserReceiveSocket(mensaje_recibido);
            actualMoveIsSetted = true;
            //convertimos el mensaje de posiciones en coordenadas
            actualMove = ModelViewConnection.game.Board[_coordinate];
            //juego con el movimiento que hizo el jugador remoto.
            putStone(actualMove);
         }

        private void resetActualMove()
        {
            actualMove = null;
            actualMoveIsSetted = false;
        }


        public override Boolean isHumanPlayer() { return true; }

        public override void setMove(Position aPosition)
        {
            actualMove = aPosition;
            actualMoveIsSetted = true;
        }

        public override string playerType() { return "Remoto"; }
    }
}